/*
 * @作者: kerwin
 * @公众号: 大前端私房菜
 */
// 直接使用字面量进行类型声明
let h:10;
h = 10;
// 很少这样使用 一般不用 
// 实际可以加个竖线 或  可以赋值好几个 连接多个类型 （联合类型）
let z:"male" | "false" | "zzz";
z ="zzz";
z ="male";

let AA: boolean | string;
AA = true;
AA = "dajiowadiaid人";

// any 就是随便类型  一个变量设置类型为any后 就相当于对这个变量关闭了ts的类型检测  
// 开发中 不使用 没区别
let ab:any;
ab =11;
ab="11";

// 声明变量如果不知道类型，则ts解析器会自动判断变量的类型为any(隐式的any)
let cc;
cc =111;
cc ="sdadw";

// 如果变量不知道类型  设置为unknown更为安全   是类型安全的any
let ee:unknown;
ee=111;
ee="dawdawd";
// 让字符串的e与any的ab相等  any类型会赋值给任意变量
let s:string;
// s = ab;


// unknown 类型的变量 不能直接赋值给其他变量
ee = 'hello';
// s = ee; //这样写会报错

if(typeof ee === "string"){
    s = ee;
}
// 上面是先检测 


// 还有一种类型断言 
s =ee as string;
s =<string> ee;
// 类型断言 ，可以用来高速解析器变量的实际类型
// 语法  变量 as 类型
//  <类型>变量

// void用来便是空，以函数为例，表示没有返回值的函数
function fn():void{

}

// never表示永远不会返回结果  
// function fn2():never{

// }

var list1:string[] = ["1","2","3"]
list1.push("daa")
// list.push(4)

var list2:number[] = [1,2,3]
list2.push(5)

var list3:(number | string | boolean)[] = [1,2,"aa","bbb",false]
list3.push("aaaa")
list3.push(465688)
console.log('查看ts数组',list3);

//---------------------------------------------
// 泛型写法 
var mylist1:Array<string> = ["aa","bb","cc"]
mylist1.push("dw")

var mylist2:Array<string|number> = [1,2,"aaa"]
mylist2.push(3)
var mylist3:Array<boolean | number> = [true,false,0]
mylist2.push(3)
mylist3.push(999)
export default {list3}